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

How-to guide

How to Enrich Revenue Data for AI Agents (and Why It Matters)

An AI agent is only as good as the fields you give it. Here is the search, enrich and prompt loop, with real calls.

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

AI data enrichment matters for revenue teams because a model writes from the fields you hand it. Thin records give generic copy. Verified emails, current roles and career history give copy that reads like research. This guide builds the loop in four calls.

TL;DR

  • Enrichment decides whether an AI agent can personalise or just guess. Missing fields become invented fields.
  • The recipe takes about 20 minutes and spends about 10 of your 1,000 free LeadOcean records.
  • Sizing a list is free. A 404 on enrich costs nothing. You pay only for people you receive.

Prerequisites

  • A LeadOcean account on the free plan: start free, no card.
  • An API key exported as $LEADOCEAN_API_KEY.
  • curl and jq, plus any LLM client you like. Claude, ChatGPT or a script all work.
  • Optional: the hosted MCP server at https://api.leadocean.io/mcp (OAuth sign-in, no key pasted).

Step 1: Size the list before you spend anything

Count first. A count spends no records, so run it as often as you like.

Here is the same sizing through the free leadocean_count_leads MCP tool, run on 2026-10-21:

json
{
  "jobLevel": ["VP"],
  "jobFunction": ["Sales & Business Development"],
  "country": ["US"],
  "employeeRange": ["201-500"]
}
json
{
  "total": 12281,
  "totalIsExact": true,
  "totalAll": 35380,
  "distinctCompanies": 6321,
  "credits": 0
}

total counts only mailable people (verified, catch_all_valid or catch_all). totalAll is the same filters with no email condition. Quote the first when you plan to send email.

Over REST, send a search with count=true in the query string and limit 1. It is free.

bash
curl -s "https://api.leadocean.io/v1/people/search?count=true&limit=1" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jobLevel":["VP"],"jobFunction":["Sales & Business Development"],"country":["US"],"employeeRange":["201-500"]}' | jq .meta

Sizing is the first place enrichment pays off for a revenue team. If the count is 154, you write by hand. If it is 12,281, you need a template, and a template needs fields that exist on every row.

distinctCompanies tells you how many employers those people span. A list of 12,281 people across 6,321 companies suits account-level plays. A list of 12,281 people at 40 companies is a different campaign.

Step 2: Pull a small, mailable sample

Search returns a thin row with no contact points. Each row carries its id at meta.source_ids.person_id. Keep the sample small while you tune the prompt.

bash
curl -s 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": ["US"],
    "employeeRange": ["201-500"],
    "emailStatus": ["verified"],
    "limit": 5
  }' > sample.json
jq '.data | length' sample.json

The body is flat JSON. Filters are arrays. limit runs 1 to 100, and you page with cursor. Five people cost 5 records.

Enum values are exact strings. Check them with the free leadocean_list_enum_values tool before you guess.

Step 3: Enrich each person by person_id

Search gives you the person. Enrichment gives the agent its context: the current role, past roles, education and certifications. Enrich takes exactly one of linkedin_url, email, phone or person_id.

bash
for id in $(jq -r '.data[].meta.source_ids.person_id' sample.json); do
  curl -s https://api.leadocean.io/v1/people/enrich \
    -H "x-api-key: $LEADOCEAN_API_KEY" \
    -H "Content-Type: application/json" \
    -d "{\"person_id\":\"$id\",\"reveal_email\":true}"
done | jq -s '.' > enriched.json

reveal_email returns the address and costs no extra record. A person we hold nothing for returns a 404 and costs nothing. Since October 2026 the response includes career history in resume_data.

Three habits keep the output honest. Filter on emailStatus at search time, not after. Enrich only the rows you will use. Store fetched_at next to each field, because the dataset refreshes monthly and a stale title is the commonest cause of a wrong first line.

Step 4: Hand the fields to the model, with a rule about gaps

The prompt matters as much as the data. Tell the model to use only fields present and to say nothing where a field is empty.

text
You write a first line for a cold email.
Use ONLY the JSON below. If a field is missing, do not mention it.
Pick one fact: current role, a past employer from resume_data.experiences,
or a certification. Max 20 words. No flattery.

{{one record from enriched.json}}

This is where enrichment pays. With a verified work email, a current title and one past role, the model has a real hook. With a bare name, it invents one.

Run it on five records and read every output. Then change one variable at a time: the field you pick, the word limit, the banned phrases. When five outputs read right, scale to fifty. Do not tune on five hundred.

Here is the check to run on each result. Does the sentence rest on a field in the JSON? If not, the model guessed, and the prompt needs a harder rule or the record needs a better source.

You can skip the scripts. Connect the MCP server and ask the agent to run the same loop with leadocean_count_leads, leadocean_search_leads and leadocean_get_lead. The agent pays records only on the last two.

Why this matters for revenue is arithmetic, not theory. Every wrong field costs a bounce, a bad first line or a rep's minute. A model repeats that mistake at the speed of your send limit, so quality has to be fixed upstream, in the data.

What you get

This is the response shape from the API reference (api.leadocean.io/openapi.json and the enrich docs), shown with placeholder values. It is not a real record.

json
{
  "success": true,
  "data": {
    "profile_data": {
      "profile_full_name": "Jane Doe",
      "profile_headline": "VP Sales at Acme",
      "profile_url": "https://www.linkedin.com/in/jane-doe"
    },
    "contact_data": {
      "has_email": true,
      "email_status": "verified",
      "email_type": "work",
      "contact_emails": [
        { "email": "jane.doe@acme.com", "type": "work", "status": "verified" }
      ],
      "contact_phones": [{ "phone": "+14155550133", "type": "mobile" }],
      "contact_current_experiences": [
        { "job_title": "VP Sales", "company_name": "Acme", "company_domain": "acme.com" }
      ]
    },
    "resume_data": {
      "experiences": [
        { "job_title": "Director of Sales", "company_name": "Example Co" }
      ],
      "educations": [],
      "certifications": []
    },
    "meta": { "fetched_at": "2026-10-01", "schema": "leadocean.person.v1" }
  },
  "meta": { "credits": 1, "source": "own" }
}

Each field appears only when we hold it. Past employers carry no company_id yet. Read email_status before you send, because bounces are not refunded.

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-key headerRe-export $LEADOCEAN_API_KEY and check the header name.
429Above the plan's rate limit (5 a second on Free, 200 on Agency)Wait for Retry-After, or add a short sleep in the loop.
402The 1,000 free records are spentMove to Solo ($97 a month) or Agency ($497 a month).
Empty resultsEnum value is not an exact string, such as vp for jobLevelLook the value up with leadocean_list_enum_values.
404 on enrichWe hold nothing for that identifierCosts nothing. Try another identifier or skip the row.
Search stops at 10,000 rowsDepth cap, shown as meta.depthCappedNarrow the filters instead of paging further.

FAQ

What is AI data enrichment?

It is filling in missing fields on a lead (email, phone, role, company facts) so a model or a rep can act on it. The AI part is what consumes the fields, not the lookup itself. See what is data enrichment.

Why does it matter more with AI agents than with reps?

A rep notices a blank field and skips it. A model fills it with something plausible. Complete, verified data is the cheapest guardrail you have.

Does accuracy still matter if the model is good?

Yes. A fluent email to a dead address still bounces. Read why B2B data accuracy matters most and filter on emailStatus.

Do I need a waterfall?

Not to start. Read what waterfall enrichment is and add hops only where one source leaves gaps you can measure.

What does it cost at volume?

Free covers 1,000 records for life. Paid plans use a fair-use pace, not credits. See pricing.

More guides live in the LeadOcean blog.

Give your AI agent complete records, free

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

Get your free API key →